package main

import (
	"fmt"

	_ "github.com/go-sql-driver/mysql"

	"github.com/jinzhu/gorm"
)

type Animal struct {
	ID   int64
	Name string
	Age  int64
}

func main() {
	db, err := gorm.Open("mysql", "root:root@/gormdemo?charset=utf8&parseTime=true&loc=Local")
	if err != nil {
		fmt.Printf("连接数据库失败，失败原因：%v\n", err)
	}

	defer db.Close()

	// 创建空结构体封装请求参数
	var animal Animal
	db.First(&animal) // 查询第一条数据，不携带条件
	fmt.Println(&animal)

	var animal1 Animal
	db.Where("name = ?", "张三").Find(&animal1) // 绑定条件,'?'是占位符
	fmt.Println(&animal1)

	//In用法
	var animal2 []Animal
	db.Where("name in (?)", []string{"张三", "李四", "王五"}).Find(&animal2)
	fmt.Println(&animal2) // 不用指针指向，则为拷贝

	// Like用法
	var animal3 []Animal
	db.Where("name like ?", "%张%").Find(&animal3)
	fmt.Println(&animal3)

	//AND
	var animal4 []Animal
	db.Where("name = ? AND age = ?", "张三", 18).Find(&animal4)
	fmt.Println(&animal4)

	//count总数计算，使用Count()方法
	// 定义一个接收Count()方法的返回值变量
	var count int
	var animal5 []Animal
	db.Find(&animal5).Count(&count)
	fmt.Printf("查询的结果为：%v\n 查询条数：%d\n", &animal5, count)

	//Select查询，select(?,?)参数传什么代表查询什么
	//没有定义的则不封装到结构体里，而主键不为空则会以0代替
	var animal6 []Animal
	db.Select("name,age").Find(&animal6)
	fmt.Println(&animal6)

	var animal7 []Animal
	db.Select("age").Find(&animal7)
	fmt.Println(&animal7)
}
